//============================================================================================
/**
 * @file	bag_main.h
 * @brief	バッグ画面処理
 * @author	Hiroyuki Nakamura
 * @date	06.04.17
 */
//============================================================================================
#ifndef BAG_MAIN_H
#define BAG_MAIN_H
#undef GLOBAL
#ifdef BAG_MAIN_H_GLOBAL
#define GLOBAL	/*	*/
#else
#define GLOBAL	extern
#endif


#include "itemtool/myitem.h"
#include "system/touch_subwindow.h"
#include "system/keytouch_status.h"
//============================================================================================
//	定数定義
//============================================================================================
#define	BAG_LARGE_POKE_MAX		( BAG_NORMAL_ITEM_MAX )		// 最大サイズのポケット（どうぐの種類 include/itemtool/myitem.h)
#define BAG_POCKET_NUM			( 8 ) 						// ポケット（どうぐタイプの種類の数）

#define BAG_PAGE_ITEM_NUM		( 6 )						// 金銀バッグで１ページに表示できるどうぐの数

#define BAG_SELECT_MENU_PLATE_NUM	( 4 )					// 選択時の選択肢表示の数（＋「やめる」で５つ表示）

#define BAG_ITEM_COUNT_BUTTON_NUM	( 6 )					// 売る・捨てるの時の数字選択用OBJの数

#define	P_ICON_SIZ_X	( 10 )		// ポケットアイコンのXサイズ
#define	P_ICON_SIZ_Y	( 10 )		// ポケットアイコンのYサイズ
#define	P_ICON_DEF_PX	( 6 )		// ポケットアイコンの表示X座標
#define	P_ICON_DEF_SX	( 90 )		// ポケットアイコンの表示領域のXサイズ

#define BAG_SUB_ACTOR_DISTANCE	( 256*FX32_ONE )

#define	BAG_TMPMSG_SIZ	( 256 )		// メッセージ展開場所の文字数


// ウィンドウインデックス
enum {
	WIN_INFO = 0,		// アイテム情報（上画面）
	WIN_WAZA_INFO,		// わざ情報（上画面）
	WIN_MENU_INFO,
	WIN_TALK,

	WIN_SALE_NUM,

	WIN_PORUTO,

	WIN_PAGE,		// ページ番号「１／３」など
	WIN_CANCEL,		// 「やめる」

	WIN_MAX,
};


enum {
	ADD_WIN_ITEM0=0,		// アイテム名描画６個
	ADD_WIN_ITEM1,
	ADD_WIN_ITEM2,
	ADD_WIN_ITEM3,
	ADD_WIN_ITEM4,
	ADD_WIN_ITEM5,

	ADD_WIN_ITEM0_S,		// アイテム名描画６個（スワップ用）
	ADD_WIN_ITEM1_S,
	ADD_WIN_ITEM2_S,
	ADD_WIN_ITEM3_S,
	ADD_WIN_ITEM4_S,
	ADD_WIN_ITEM5_S,

	ADD_WIN_SELECT_ITEM,// 選択されたアイテム名をセンターに描画する

	ADD_WIN_SELECT0,	// 選択肢４つ
	ADD_WIN_SELECT1,
	ADD_WIN_SELECT2,
	ADD_WIN_SELECT3,

	ADD_WIN_NUM_100,	// ３桁の数字100の列
	ADD_WIN_NUM_10,		// ３桁の数字10の列
	ADD_WIN_NUM_1,		// ３桁の数字1の列
	ADD_WIN_DEPOSIT,	// 「すてる」

	ADD_WIN_MINITALK,	// どうぐを売る画面用のミニ会話ウインドウ

	ADD_WIN_GOLD,		// 所持金（おこづかい）

	ADD_WIN_SALE_GOLD,	// どうぐを売った時に貰う金額

	ADD_SUB_WIN_MAX,

};
// 追加ウィンドウインデックス
enum {
	ADD_WIN_MENU = 0,
	ADD_WIN_SEL_ITEM,
	ADD_WIN_MESSAGE,

	ADD_WIN_MAX
};

// メニュー項目
enum {
	BAG_MENU_TSUKAU = 0,	// つかう
	BAG_MENU_ORIRU,			// おりる
	BAG_MENU_MIRU,			// みる
	BAG_MENU_UMERU,			// うめる
	BAG_MENU_HIRAKU,		// ひらく
	BAG_MENU_SUTERU,		// すてる
	BAG_MENU_TOUROKU,		// とうろく
	BAG_MENU_KAIZYO,		// かいじょ
	BAG_MENU_MOTASERU,		// もたせる
	BAG_MENU_TAGUWOMIRU,	// タグをみる
	BAG_MENU_KETTEI,		// けってい
	BAG_MENU_YAMERU,		// やめる
	BAG_MENU_IDOU,		    // いどう
	BAG_MENU_URU,			// うる
	BAG_MENU_TSUKAU_NP,		// つかう（木の実プランター用）
	BAG_MENU_TOMERU,		// とめる（ＧＢプレイヤー終了用）

	BAG_MENU_MAX
};

enum{
	BAG_MENU_USE=0,		// つかう・みる・おりる
	BAG_MENU_SUB,		// すてる・とうろく・かいじょ
	BAG_MENU_GIVE,		// もたせる
	BAG_MENU_ITEMMOVE,	// いどう
	BAG_MENU_CANCEL,
	BAG_MENUTBL_MAX,
};

// セルアクター管理番号
enum {
	ACT_LIST_SEL_CHANGE,

	ACT_ITEMICON0,		// 1
	ACT_ITEMICON1,
	ACT_ITEMICON2,
	ACT_ITEMICON3,
	ACT_ITEMICON4,
	ACT_ITEMICON5,

	ACT_TYPE,			// 7
	ACT_KIND,

	ACT_BAG_BUTTON_1,	// 9
	ACT_BAG_BUTTON_2,
	ACT_BAG_BUTTON_3,
	ACT_BAG_BUTTON_4,
	ACT_BAG_BUTTON_5,
	ACT_BAG_BUTTON_6,
	ACT_BAG_BUTTON_7,
	ACT_BAG_BUTTON_8,

	ACT_BAG_UP_BUTTON,		// 17
	ACT_BAG_DOWN_BUTTON,
	ACT_BAG_BACK_BUTTON,

	ACT_BAG_CURSOR,		// 20

	ACT_BAG_INSERT_TAG1,
	ACT_BAG_INSERT_TAG2,
	ACT_BAG_INSERT_TAG3,
	ACT_BAG_INSERT_TAG4,
	ACT_BAG_INSERT_TAG5,
	ACT_BAG_INSERT_TAG6,

	ACT_BAG_INSERT_CURSOR,	// 27

	ACT_BAG_SELECT_PLATE0,	// 28
	ACT_BAG_SELECT_PLATE1,
	ACT_BAG_SELECT_PLATE2,
	ACT_BAG_SELECT_PLATE3,

	ACT_BAG_NUM_UP0,		// 31
	ACT_BAG_NUM_UP1,
	ACT_BAG_NUM_UP2,
	ACT_BAG_NUM_DOWN0,
	ACT_BAG_NUM_DOWN1,
	ACT_BAG_NUM_DOWN2,

	ACT_BAG_BUTTON_SELL_DOPOSIT,	// 37

	BAG_ACT_MAX
};

// 数値入力指定に使う
enum {
	NUM_DIGIT_2=2,		// ２桁
	NUM_DIGIT_3=3,		// ３桁
};

// ページ切り替え用ワーク
typedef struct {
	u8	next;			// 次のページ
	u8	move;			// 移動方向

	u8	cur_seq;		// ポケットカーソル移動シーケンス
	u8	cur_cnt;		// ポケットカーソル移動カウンタ

	u8	tp_seq;			// タッチパネル処理シーケンス
	u8	tp_cnt;			// タッチパネル処理カウンタ
	u8	tp_button;		// ボタン番号
	u8	tp_chg:4;		// 違うボタンが押されたか
	u8	tp_push:3;		// タッチパネルに触れているか
	u8	tp_mode:1;		// タッチパネルでの変更かどうか
}PAGE_CHG_WORK;

// バッグで参照するデータ
typedef struct {
	MINEITEM * item;	// 参照するアイテムデータ
	u16	cur;			// カーソル位置
	s16	scr;			// スクロールカウンタ
	u8	type;			// ポケットタイプ
	u8	max;			// アイテム最大数
	u8  dummy[2];
}POCKET_DATA;

struct _BAG_DATA {
	SAVEDATA * sv;		// セーブデータ

	POCKET_DATA	p_data[BAG_POKE_MAX];	// ポケットごとのデータ
	u8	p_now;							// 現在のポケット
	u8	mode;							// バッグ画面の役割
	u16	ret_item;						// 選択アイテム
	u16	ret_mode;						// 終了モード

	void * bag_cursor;		// カーソル位置の外部記憶領域

	void * icwk;			// アイテム使用チェックワーク

	u8	use_poke;			// アイテムを使用したポケモン

	u8	fnote_sale_cnt;		// 冒険ノート用売った個数

	u16	cycle_flg:1;		// 自転車フラグ ( 0=off, 1=on )
	u16	map_mode:15;		// マップモード

	KEYTOUCH_STATUS *kt_status;

};

typedef struct {
	u8	req;
	u8	mv;
	u8	next;
	u8	cnt;
	fx32 tbl[BAG_POCKET_NUM];	// ページカーソル移動テーブル
}POCKET_CURSOR_MOVE;

#define	BAG3D_ANM_MAX	( 8 )	// 3Dアニメ数

// シーンデータ
typedef struct {
	NNSG3dRenderObj	rendObj;
	NNSG3dResMdl * mdl;
	NNSG3dResFileHeader * rh;
	void * anmMem[BAG3D_ANM_MAX];
	void * icaMem[BAG3D_ANM_MAX];
	void * itaMem;
	NNSG3dAnmObj * itpObj[BAG3D_ANM_MAX];
	NNSG3dAnmObj * icaObj[BAG3D_ANM_MAX];
	NNSG3dAnmObj * itaObj;
	u32	anmNum;
}BAG3D_SCENE_DATA;

// 3Dワーク
typedef struct {
	NNSFndAllocator	allocator;
	GF_CAMERA_PTR	camera;		// カメラ
	BAG3D_SCENE_DATA	scene;	// シーンデータ
//	u32	scene_max;				// シーンデータ数
	VecFx32 target;

	// 移動カメラ用ワーク
	GF_CAMERA_PARAM camera_param;
	int				inter[3];		// バッグの補間インデックス（[0]から[1]へ）
	u16				frame, frame_max;
	VecFx32			model_trans;	// モデル座標
}BAG_3D_WORK;

typedef struct BAG_WORK_tag BAG_WORK;

// ボタンアニメワーク
typedef struct {
	u8	id;
	u8	pal1:4;
	u8	pal2:4;
	u8	mode;
	u8	seq:4;
	u8	cnt:4;
	int	next;
}BAG_BUTTON_ANM_WORK;

struct BAG_WORK_tag{
	GF_BGL_INI * bgl;						// BGLデータ

	GF_BGL_BMPWIN	win[WIN_MAX];			// BMPウィンドウデータ（通常）
	GF_BGL_BMPWIN	add_win[ADD_WIN_MAX];	// BMPウィンドウデータ（追加）
	GF_BGL_BMPWIN	sub_win[ADD_SUB_WIN_MAX];

	BAG_DATA * dat;							// バッグデータ

	MYITEM * myitem;		// 手持ちアイテムデータ
	MYSTATUS * myst;		// プレーヤーデータ
	CONFIG * cfg;			// コンフィグデータ

	ARCHANDLE * gra_h;		// グラフィックのアーカイブハンドル

	CATS_SYS_PTR	csp;
	CATS_RES_PTR	crp;
	CATS_ACT_PTR	cap[BAG_ACT_MAX];

	NUMFONT * num_font;			// 8x8フォント
	MSGDATA_MANAGER * msg_man;	// メッセージデータマネージャ
	WORDSET * wset;				// 単語セット

	MSGDATA_MANAGER * item_man;	// メッセージデータマネージャ
	MSGDATA_MANAGER * waza_man;	// メッセージデータマネージャ

	STRBUF * menu_str[BAG_MENU_MAX];	// メニュー項目
	BMP_MENULIST_DATA * md;				// BMPメニューデータ
	BMPMENU_WORK * mw;					// BMPメニューワーク

	BMPLIST_WORK * lw;			// BMPリストデータ
	BMP_MENULIST_DATA * ld;		// BMPリストデータ
	STRBUF * itemname[BAG_LARGE_POKE_MAX];					// アイテム名展開場所

	STRBUF * expb;			// メッセージ展開場所

	STRBUF * num_str1;		// 個数表示・"x"
	STRBUF * num_str2;		// 個数表示・個数
	STRBUF * num_str3;		// 選択しているどうぐの位置（ 1/50 など）

	STRBUF * pocket_name[BAG_POKE_MAX];	// ポケット名展開場所ポインタ
	u8	p_max;				// ポケット数

	u8	sex;				// 性別

	u8	midx;				// メッセージインデックス

	u8	p_icon_gx;			// ページ０のアイコンのX座標
	u8	p_icon_sx;			// アイコンの間隔

	PAGE_CHG_WORK	page_work;
	fx32 p_mv_tbl[8];		// ページカーソル移動テーブル

	int					cursor_pos;	// 決定する前に動かすカーソルの情報
	POCKET_CURSOR_MOVE	pcmv;		// ポケットの状態を保存するカーソル情報
	int					select_cursor_pos;
	u8	p_next;

	u8	irekae_flg;
	u8	irekae_pos;
	u32	irekae_param;

	u8	arrow_mv;
	u8	arrow_cnt;

	u8	se_type;		// リスト選択時のSE

	u8	sub_seq;		// サブシーケンス
	u32	use_func;		// バッグ内使用関数

	s16	sel_num;		// 個数選択：選択数
	u16	sel_max;		// 個数選択：最大数
	u32	sel_price;		// 選択されたアイテムの値段

	u8	enter_anm_flg;	// サブ画面決定ボタンアニメ
	u8	enter_anm_cnt;	// サブ画面決定ボタンカウント

	u8	itemlist_swap;	// アイテムリスト描画スワップフラグ

	// 背景のパレット変更用にパレットデータをメモリ上に保持する
	void 			   *bgPalData[2];	// 0〜7：明るいボタン色（用途未定）　／　8〜F：暗いボタン色（パッシブ）
	NNSG2dPaletteData  *bgPalPtr[2];	// 0〜7：通常ボタン色　／　8〜F： itemBG05_d.nsc用

	// OBJのパレット変更用にパレットデータをメモリ上に保持する
	void 			   *objPalData;
	NNSG2dPaletteData  *objPalPtr;

	u16  exist_item[BAG_LARGE_POKE_MAX];
	int (*menu_func[BAG_MENUTBL_MAX])( BAG_WORK * wk );

	// はい・いいえウインドウ用ワーク
	TOUCH_SW_SYS	*tss;

	BAG_3D_WORK	wk3d;

	BAG_BUTTON_ANM_WORK	button_anm_work;
	u32	sel_menu;
};

typedef int (*pBagFunc)(BAG_WORK *);	// 関数ポインタ型


#define	POS_GET_ID		( 0 )		// アイテム番号
#define	POS_GET_NUM		( 1 )		// 所持数


//============================================================================================
//	プロトタイプ宣言
//============================================================================================

extern u16 Bag_PosItemGet( BAG_WORK * wk, u16 pos, u16 id );
extern STRBUF* BAG_AllocItemName( MSGDATA_MANAGER * man, u16 item );
extern void BgObj_InsertCursorPosAppearSet( BAG_WORK *wk, int pos );
extern void BAGMAIN_InfoWinLoad( BAG_WORK * wk, BOOL flg );
extern BOOL BAGMAIN_NPlanterUseCheck( u16 pocket, u16 item );


#undef GLOBAL
#endif	/* BAG_MAIN_H */